"use strict";

function _templateObject() {
  var data = _taggedTemplateLiteral(["123"]);

  _templateObject = function _templateObject() {
    return data;
  };

  return data;
}

function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }

// console.log("\u0061");
//a
// console.log("\uD842\uDFB7");
// "𠮷"

/*
如果直接在\u后面跟上超过0xFFFF的数值（比如\u20BB7），JavaScript 会理解成\u20BB+7。
由于\u20BB是一个不可打印字符，所以只会显示一个空格，后面跟着一个7。
*/
// console.log("\u20BB7");
//7

/*
ES6 对这一点做出了改进，只要将码点放入大括号，就能正确解读该字符。 
*/
// console.log("\u{20BB7}");
// console.log("\u{41}\u{42}\u{43}"); 

/*
大括号表示法与四字节的 UTF-16 编码是等价的。

有了这种表示法之后，JavaScript 共有 6 种方法可以表示一个字符。
*/
// let hello = 123;
// hell\u{6F} // 123
// console.log('\u{1F680}' === '\uD83D\uDE80');
// console.log('\z' === 'z');  // true
// console.log('\172' === 'z'); // true
// console.log('\x7A' === 'z'); // true
// console.log('\u007A' === 'z'); // true
// console.log('\u{7A}' === 'z'); // true

/*
字符串的遍历器接口
ES6 为字符串添加了遍历器接口（详见《Iterator》一章），使得字符串可以被for...of循环遍历。
*/
// for (let codePoint of 'foo') {
//   console.log(codePoint)
// }
// "f"
// "o"
// "o"

/*
除了遍历字符串，这个遍历器最大的优点是可以识别大于0xFFFF的码点，传统的for循环无法识别这样的码点。

字符串text只有一个字符，但是for循环会认为它包含两个字符（都不可打印），而for...of循环会正确识别出这一个字符。
*/
// let text = String.fromCodePoint(0x20BB7);
// for (let i = 0; i < text.length; i++) {
//   console.log(text[i]);
// }
// // " "
// // " "
// for (let i of text) {
//   console.log(i);
// }
// // "𠮷"

/*
模板字符串
*/
//原始传统写法
// let basket = {count:1,onSale:1};
// console.log(
//   'There are <b>' + basket.count + '</b> ' +
//   'items in your basket, ' +
//   '<em>' + basket.onSale +
//   '</em> are on sale!'
// );

/*
ES6 引入了模板字符串解决这个问题。

*/
// console.log(`
//   There are <b>${basket.count}</b> items
//    in your basket, <em>${basket.onSale}</em>
//   are on sale!
// `)

/*
模板字符串（template string）是增强版的字符串，用反引号（`）标识。它可以当作普通字符串使用，也可以用来定义多行字符串，或者在字符串中嵌入变量。
模板字符串，都是用反引号表示。如果在模板字符串中需要使用反引号，则前面要用反斜杠转义
*/
// // 普通字符串
// `In JavaScript '\n' is a line-feed.`
// // 多行字符串
// `In JavaScript this is
//  not legal.`
// console.log(`string text line 1
// string text line 2`);
// // 字符串中嵌入变量
// let [name,time] = ["Bob","today"];
// `Hello ${name}, how are you ${time}?`

/*
使用模板字符串表示多行字符串，所有的空格和缩进都会被保留在输出之中
*/
// console.log(`
// <ul>
//   <li>first</li>
//   <li>second</li>
// </ul>
// `);

/*
所有模板字符串的空格和换行，都是被保留的，比如<ul>标签前面会有一个换行。如果你不想要这个换行，可以使用trim方法消除它。
*/
// console.log(`
// <ul>
//   <li>first</li>
//   <li>second</li>
// </ul>
// `.trim());

/*
模板字符串中嵌入变量，需要将变量名写在${}之中。
大括号内部可以放入任意的 JavaScript 表达式，可以进行运算，以及引用对象属性。
*/
// let x = 1;
// let y = 2;
// `${x} + ${y} = ${x + y}`
// // "1 + 2 = 3"
// `${x} + ${y * 2} = ${x + y * 2}`
// // "1 + 4 = 5"
// let obj = {x: 1, y: 2};
// `${obj.x + obj.y}`
// // "3"

/*
模板字符串之中还能调用函数。
*/
// function fn() {
//   return "Hello World";
// }
// `foo ${fn()} bar`
// foo Hello World bar

/*
如果大括号中的值不是字符串，将按照一般的规则转为字符串。比如，大括号中是一个对象，将默认调用对象的toString方法。

如果模板字符串中的变量没有声明，将报错。
*/
// 变量place没有声明
// let msg = `Hello, ${place}`
//place is not defined

/*
模板字符串甚至还能嵌套。
*/
// const tmpl = addrs => `
//   <table>
//   ${addrs.map(addr => `
//     <tr><td>${addr.first}</td></tr>
//     <tr><td>${addr.last}</td></tr>
//   `).join('')}
//   </table>
// `;
// console.log(tmpl([{first:'a0',last:'b0'},{first:'a1',last:'b1'}]));

/*
模板字符串写成了一个函数的返回值。执行这个函数，就相当于执行这个模板字符串了
*/
// let func = (name) => `Hello ${name}!`;
// func('Jack') // "Hello Jack!"

/*
通过模板字符串，生成正式模板的实例。
*/
// let data = { supplies: [ "broom", "mop", "cleaner" ] };
// let template = `
// <ul>
//   <% for(let i=0; i < data.supplies.length; i++) { %>
//     <li><%= data.supplies[i] %></li>
//   <% } %>
// </ul>
// `;

/*
标签模板
*/
alert(_templateObject());